def bubble_sort(nums):
    max_index = len(nums) - 1
    for i in range(max_index):
        is_exchange = False
        # i的作用是控制内层循环的次数。
        # 内层循环负责元素交换，把最大/最小元素移到右侧。如第1次外循环，内循环就把最大/最小元素挪到倒数第1位（第2次就是挪到倒数第2位……）
        # 由于右侧的已经是排好序的，因此只需关注倒数第i个之前的就可以了
        for j in range(max_index - i):
            if nums[j] < nums[j + 1]:
                nums[j], nums[j + 1] = nums[j + 1], nums[j]
                is_exchange = True
        if not is_exchange:
            break


if __name__ == "__main__":
    nums = [4, 2, 1, 3]
    bubble_sort(nums)
    print(nums)